home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / inspect.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  20KB  |  741 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. __author__ = 'Ka-Ping Yee <ping@lfw.org>'
  5. __date__ = '1 Jan 2001'
  6. import sys
  7. import os
  8. import types
  9. import string
  10. import re
  11. import dis
  12. import imp
  13. import tokenize
  14. import linecache
  15. from operator import attrgetter
  16.  
  17. def ismodule(object):
  18.     return isinstance(object, types.ModuleType)
  19.  
  20.  
  21. def isclass(object):
  22.     if not isinstance(object, types.ClassType):
  23.         pass
  24.     return hasattr(object, '__bases__')
  25.  
  26.  
  27. def ismethod(object):
  28.     return isinstance(object, types.MethodType)
  29.  
  30.  
  31. def ismethoddescriptor(object):
  32.     if hasattr(object, '__get__') and not hasattr(object, '__set__') and not ismethod(object) and not isfunction(object):
  33.         pass
  34.     return not isclass(object)
  35.  
  36.  
  37. def isdatadescriptor(object):
  38.     if hasattr(object, '__set__'):
  39.         pass
  40.     return hasattr(object, '__get__')
  41.  
  42. if hasattr(types, 'MemberDescriptorType'):
  43.     
  44.     def ismemberdescriptor(object):
  45.         return isinstance(object, types.MemberDescriptorType)
  46.  
  47. else:
  48.     
  49.     def ismemberdescriptor(object):
  50.         return False
  51.  
  52. if hasattr(types, 'GetSetDescriptorType'):
  53.     
  54.     def isgetsetdescriptor(object):
  55.         return isinstance(object, types.GetSetDescriptorType)
  56.  
  57. else:
  58.     
  59.     def isgetsetdescriptor(object):
  60.         return False
  61.  
  62.  
  63. def isfunction(object):
  64.     return isinstance(object, types.FunctionType)
  65.  
  66.  
  67. def istraceback(object):
  68.     return isinstance(object, types.TracebackType)
  69.  
  70.  
  71. def isframe(object):
  72.     return isinstance(object, types.FrameType)
  73.  
  74.  
  75. def iscode(object):
  76.     return isinstance(object, types.CodeType)
  77.  
  78.  
  79. def isbuiltin(object):
  80.     return isinstance(object, types.BuiltinFunctionType)
  81.  
  82.  
  83. def isroutine(object):
  84.     if not isbuiltin(object) and isfunction(object) and ismethod(object):
  85.         pass
  86.     return ismethoddescriptor(object)
  87.  
  88.  
  89. def getmembers(object, predicate = None):
  90.     results = []
  91.     for key in dir(object):
  92.         value = getattr(object, key)
  93.         if not predicate or predicate(value):
  94.             results.append((key, value))
  95.             continue
  96.     
  97.     results.sort()
  98.     return results
  99.  
  100.  
  101. def classify_class_attrs(cls):
  102.     mro = getmro(cls)
  103.     names = dir(cls)
  104.     result = []
  105.     for name in names:
  106.         if name in cls.__dict__:
  107.             obj = cls.__dict__[name]
  108.         else:
  109.             obj = getattr(cls, name)
  110.         homecls = getattr(obj, '__objclass__', None)
  111.         if homecls is None:
  112.             for base in mro:
  113.                 if name in base.__dict__:
  114.                     homecls = base
  115.                     break
  116.                     continue
  117.             
  118.         
  119.         if homecls is not None and name in homecls.__dict__:
  120.             obj = homecls.__dict__[name]
  121.         
  122.         obj_via_getattr = getattr(cls, name)
  123.         if isinstance(obj, staticmethod):
  124.             kind = 'static method'
  125.         elif isinstance(obj, classmethod):
  126.             kind = 'class method'
  127.         elif isinstance(obj, property):
  128.             kind = 'property'
  129.         elif ismethod(obj_via_getattr) or ismethoddescriptor(obj_via_getattr):
  130.             kind = 'method'
  131.         else:
  132.             kind = 'data'
  133.         result.append((name, kind, homecls, obj))
  134.     
  135.     return result
  136.  
  137.  
  138. def _searchbases(cls, accum):
  139.     if cls in accum:
  140.         return None
  141.     
  142.     accum.append(cls)
  143.     for base in cls.__bases__:
  144.         _searchbases(base, accum)
  145.     
  146.  
  147.  
  148. def getmro(cls):
  149.     if hasattr(cls, '__mro__'):
  150.         return cls.__mro__
  151.     else:
  152.         result = []
  153.         _searchbases(cls, result)
  154.         return tuple(result)
  155.  
  156.  
  157. def indentsize(line):
  158.     expline = string.expandtabs(line)
  159.     return len(expline) - len(string.lstrip(expline))
  160.  
  161.  
  162. def getdoc(object):
  163.     
  164.     try:
  165.         doc = object.__doc__
  166.     except AttributeError:
  167.         return None
  168.  
  169.     if not isinstance(doc, types.StringTypes):
  170.         return None
  171.     
  172.     
  173.     try:
  174.         lines = string.split(string.expandtabs(doc), '\n')
  175.     except UnicodeError:
  176.         return None
  177.  
  178.     margin = sys.maxint
  179.     for line in lines[1:]:
  180.         content = len(string.lstrip(line))
  181.         if content:
  182.             indent = len(line) - content
  183.             margin = min(margin, indent)
  184.             continue
  185.     
  186.     if lines:
  187.         lines[0] = lines[0].lstrip()
  188.     
  189.     if margin < sys.maxint:
  190.         for i in range(1, len(lines)):
  191.             lines[i] = lines[i][margin:]
  192.         
  193.     
  194.     while lines and not lines[-1]:
  195.         lines.pop()
  196.     while lines and not lines[0]:
  197.         lines.pop(0)
  198.     return string.join(lines, '\n')
  199.  
  200.  
  201. def getfile(object):
  202.     if ismodule(object):
  203.         if hasattr(object, '__file__'):
  204.             return object.__file__
  205.         
  206.         raise TypeError('arg is a built-in module')
  207.     
  208.     if isclass(object):
  209.         object = sys.modules.get(object.__module__)
  210.         if hasattr(object, '__file__'):
  211.             return object.__file__
  212.         
  213.         raise TypeError('arg is a built-in class')
  214.     
  215.     if ismethod(object):
  216.         object = object.im_func
  217.     
  218.     if isfunction(object):
  219.         object = object.func_code
  220.     
  221.     if istraceback(object):
  222.         object = object.tb_frame
  223.     
  224.     if isframe(object):
  225.         object = object.f_code
  226.     
  227.     if iscode(object):
  228.         return object.co_filename
  229.     
  230.     raise TypeError('arg is not a module, class, method, function, traceback, frame, or code object')
  231.  
  232.  
  233. def getmoduleinfo(path):
  234.     filename = os.path.basename(path)
  235.     suffixes = map((lambda .0: (suffix, mode, mtype) = .0(-len(suffix), suffix, mode, mtype)), imp.get_suffixes())
  236.     suffixes.sort()
  237.     for neglen, suffix, mode, mtype in suffixes:
  238.         if filename[neglen:] == suffix:
  239.             return (filename[:neglen], suffix, mode, mtype)
  240.             continue
  241.     
  242.  
  243.  
  244. def getmodulename(path):
  245.     info = getmoduleinfo(path)
  246.     if info:
  247.         return info[0]
  248.     
  249.  
  250.  
  251. def getsourcefile(object):
  252.     filename = getfile(object)
  253.     if string.lower(filename[-4:]) in ('.pyc', '.pyo'):
  254.         filename = filename[:-4] + '.py'
  255.     
  256.     for suffix, mode, kind in imp.get_suffixes():
  257.         if 'b' in mode and string.lower(filename[-len(suffix):]) == suffix:
  258.             return None
  259.             continue
  260.     
  261.     if os.path.exists(filename):
  262.         return filename
  263.     
  264.     if hasattr(getmodule(object, filename), '__loader__'):
  265.         return filename
  266.     
  267.  
  268.  
  269. def getabsfile(object, _filename = None):
  270.     if _filename is None:
  271.         if not getsourcefile(object):
  272.             pass
  273.         _filename = getfile(object)
  274.     
  275.     return os.path.normcase(os.path.abspath(_filename))
  276.  
  277. modulesbyfile = { }
  278. _filesbymodname = { }
  279.  
  280. def getmodule(object, _filename = None):
  281.     if ismodule(object):
  282.         return object
  283.     
  284.     if hasattr(object, '__module__'):
  285.         return sys.modules.get(object.__module__)
  286.     
  287.     if _filename is not None and _filename in modulesbyfile:
  288.         return sys.modules.get(modulesbyfile[_filename])
  289.     
  290.     
  291.     try:
  292.         file = getabsfile(object, _filename)
  293.     except TypeError:
  294.         return None
  295.  
  296.     if file in modulesbyfile:
  297.         return sys.modules.get(modulesbyfile[file])
  298.     
  299.     for modname, module in sys.modules.items():
  300.         if ismodule(module) and hasattr(module, '__file__'):
  301.             f = module.__file__
  302.             if f == _filesbymodname.get(modname, None):
  303.                 continue
  304.             
  305.             _filesbymodname[modname] = f
  306.             f = getabsfile(module)
  307.             modulesbyfile[f] = modulesbyfile[os.path.realpath(f)] = module.__name__
  308.             continue
  309.     
  310.     if file in modulesbyfile:
  311.         return sys.modules.get(modulesbyfile[file])
  312.     
  313.     main = sys.modules['__main__']
  314.     if not hasattr(object, '__name__'):
  315.         return None
  316.     
  317.     if hasattr(main, object.__name__):
  318.         mainobject = getattr(main, object.__name__)
  319.         if mainobject is object:
  320.             return main
  321.         
  322.     
  323.     builtin = sys.modules['__builtin__']
  324.     if hasattr(builtin, object.__name__):
  325.         builtinobject = getattr(builtin, object.__name__)
  326.         if builtinobject is object:
  327.             return builtin
  328.         
  329.     
  330.  
  331.  
  332. def findsource(object):
  333.     if not getsourcefile(object):
  334.         pass
  335.     file = getfile(object)
  336.     module = getmodule(object, file)
  337.     if module:
  338.         lines = linecache.getlines(file, module.__dict__)
  339.     else:
  340.         lines = linecache.getlines(file)
  341.     if not lines:
  342.         raise IOError('could not get source code')
  343.     
  344.     if ismodule(object):
  345.         return (lines, 0)
  346.     
  347.     if isclass(object):
  348.         name = object.__name__
  349.         pat = re.compile('^(\\s*)class\\s*' + name + '\\b')
  350.         candidates = []
  351.         for i in range(len(lines)):
  352.             match = pat.match(lines[i])
  353.             if match:
  354.                 if lines[i][0] == 'c':
  355.                     return (lines, i)
  356.                 
  357.                 candidates.append((match.group(1), i))
  358.                 continue
  359.         
  360.         if candidates:
  361.             candidates.sort()
  362.             return (lines, candidates[0][1])
  363.         else:
  364.             raise IOError('could not find class definition')
  365.     
  366.     if ismethod(object):
  367.         object = object.im_func
  368.     
  369.     if isfunction(object):
  370.         object = object.func_code
  371.     
  372.     if istraceback(object):
  373.         object = object.tb_frame
  374.     
  375.     if isframe(object):
  376.         object = object.f_code
  377.     
  378.     if iscode(object):
  379.         if not hasattr(object, 'co_firstlineno'):
  380.             raise IOError('could not find function definition')
  381.         
  382.         lnum = object.co_firstlineno - 1
  383.         pat = re.compile('^(\\s*def\\s)|(.*(?<!\\w)lambda(:|\\s))|^(\\s*@)')
  384.         while lnum > 0:
  385.             if pat.match(lines[lnum]):
  386.                 break
  387.             
  388.             lnum = lnum - 1
  389.         return (lines, lnum)
  390.     
  391.     raise IOError('could not find code object')
  392.  
  393.  
  394. def getcomments(object):
  395.     
  396.     try:
  397.         (lines, lnum) = findsource(object)
  398.     except (IOError, TypeError):
  399.         return None
  400.  
  401.     if ismodule(object):
  402.         start = 0
  403.         if lines and lines[0][:2] == '#!':
  404.             start = 1
  405.         
  406.         while start < len(lines) and string.strip(lines[start]) in ('', '#'):
  407.             start = start + 1
  408.         if start < len(lines) and lines[start][:1] == '#':
  409.             comments = []
  410.             end = start
  411.             while end < len(lines) and lines[end][:1] == '#':
  412.                 comments.append(string.expandtabs(lines[end]))
  413.                 end = end + 1
  414.             return string.join(comments, '')
  415.         
  416.     elif lnum > 0:
  417.         indent = indentsize(lines[lnum])
  418.         end = lnum - 1
  419.         if end >= 0 and string.lstrip(lines[end])[:1] == '#' and indentsize(lines[end]) == indent:
  420.             comments = [
  421.                 string.lstrip(string.expandtabs(lines[end]))]
  422.             if end > 0:
  423.                 end = end - 1
  424.                 comment = string.lstrip(string.expandtabs(lines[end]))
  425.                 while comment[:1] == '#' and indentsize(lines[end]) == indent:
  426.                     comments[:0] = [
  427.                         comment]
  428.                     end = end - 1
  429.                     if end < 0:
  430.                         break
  431.                     
  432.                     comment = string.lstrip(string.expandtabs(lines[end]))
  433.             
  434.             while comments and string.strip(comments[0]) == '#':
  435.                 comments[:1] = []
  436.             while comments and string.strip(comments[-1]) == '#':
  437.                 comments[-1:] = []
  438.             return string.join(comments, '')
  439.         
  440.     
  441.  
  442.  
  443. class EndOfBlock(Exception):
  444.     pass
  445.  
  446.  
  447. class BlockFinder:
  448.     
  449.     def __init__(self):
  450.         self.indent = 0
  451.         self.islambda = False
  452.         self.started = False
  453.         self.passline = False
  454.         self.last = 1
  455.  
  456.     
  457.     def tokeneater(self, type, token, .3, .4, line):
  458.         (srow, scol) = .3
  459.         (erow, ecol) = .4
  460.         if not self.started:
  461.             if token in ('def', 'class', 'lambda'):
  462.                 if token == 'lambda':
  463.                     self.islambda = True
  464.                 
  465.                 self.started = True
  466.             
  467.             self.passline = True
  468.         elif type == tokenize.NEWLINE:
  469.             self.passline = False
  470.             self.last = srow
  471.             if self.islambda:
  472.                 raise EndOfBlock
  473.             
  474.         elif self.passline:
  475.             pass
  476.         elif type == tokenize.INDENT:
  477.             self.indent = self.indent + 1
  478.             self.passline = True
  479.         elif type == tokenize.DEDENT:
  480.             self.indent = self.indent - 1
  481.             if self.indent <= 0:
  482.                 raise EndOfBlock
  483.             
  484.         elif self.indent == 0 and type not in (tokenize.COMMENT, tokenize.NL):
  485.             raise EndOfBlock
  486.         
  487.  
  488.  
  489.  
  490. def getblock(lines):
  491.     blockfinder = BlockFinder()
  492.     
  493.     try:
  494.         tokenize.tokenize(iter(lines).next, blockfinder.tokeneater)
  495.     except (EndOfBlock, IndentationError):
  496.         pass
  497.  
  498.     return lines[:blockfinder.last]
  499.  
  500.  
  501. def getsourcelines(object):
  502.     (lines, lnum) = findsource(object)
  503.     if ismodule(object):
  504.         return (lines, 0)
  505.     else:
  506.         return (getblock(lines[lnum:]), lnum + 1)
  507.  
  508.  
  509. def getsource(object):
  510.     (lines, lnum) = getsourcelines(object)
  511.     return string.join(lines, '')
  512.  
  513.  
  514. def walktree(classes, children, parent):
  515.     results = []
  516.     classes.sort(key = attrgetter('__module__', '__name__'))
  517.     for c in classes:
  518.         results.append((c, c.__bases__))
  519.         if c in children:
  520.             results.append(walktree(children[c], children, c))
  521.             continue
  522.     
  523.     return results
  524.  
  525.  
  526. def getclasstree(classes, unique = 0):
  527.     children = { }
  528.     roots = []
  529.     for c in classes:
  530.         if c.__bases__:
  531.             for parent in c.__bases__:
  532.                 if parent not in children:
  533.                     children[parent] = []
  534.                 
  535.                 children[parent].append(c)
  536.                 if unique and parent in classes:
  537.                     break
  538.                     continue
  539.             
  540.         if c not in roots:
  541.             roots.append(c)
  542.             continue
  543.     
  544.     for parent in children:
  545.         if parent not in classes:
  546.             roots.append(parent)
  547.             continue
  548.     
  549.     return walktree(roots, children, None)
  550.  
  551. (CO_OPTIMIZED, CO_NEWLOCALS, CO_VARARGS, CO_VARKEYWORDS) = (1, 2, 4, 8)
  552.  
  553. def getargs(co):
  554.     if not iscode(co):
  555.         raise TypeError('arg is not a code object')
  556.     
  557.     nargs = co.co_argcount
  558.     names = co.co_varnames
  559.     args = list(names[:nargs])
  560.     step = 0
  561.     for i in range(nargs):
  562.         if args[i][:1] in ('', '.'):
  563.             stack = []
  564.             remain = []
  565.             count = []
  566.             while step < len(co.co_code):
  567.                 op = ord(co.co_code[step])
  568.                 step = step + 1
  569.                 if op >= dis.HAVE_ARGUMENT:
  570.                     opname = dis.opname[op]
  571.                     value = ord(co.co_code[step]) + ord(co.co_code[step + 1]) * 256
  572.                     step = step + 2
  573.                     if opname in ('UNPACK_TUPLE', 'UNPACK_SEQUENCE'):
  574.                         remain.append(value)
  575.                         count.append(value)
  576.                     elif opname == 'STORE_FAST':
  577.                         stack.append(names[value])
  578.                         if not remain:
  579.                             stack[0] = [
  580.                                 stack[0]]
  581.                             break
  582.                         else:
  583.                             remain[-1] = remain[-1] - 1
  584.                             while remain[-1] == 0:
  585.                                 remain.pop()
  586.                                 size = count.pop()
  587.                                 stack[-size:] = [
  588.                                     stack[-size:]]
  589.                                 if not remain:
  590.                                     break
  591.                                 
  592.                                 remain[-1] = remain[-1] - 1
  593.                             if not remain:
  594.                                 break
  595.                             
  596.                     
  597.                 opname in ('UNPACK_TUPLE', 'UNPACK_SEQUENCE')
  598.             args[i] = stack[0]
  599.             continue
  600.     
  601.     varargs = None
  602.     if co.co_flags & CO_VARARGS:
  603.         varargs = co.co_varnames[nargs]
  604.         nargs = nargs + 1
  605.     
  606.     varkw = None
  607.     if co.co_flags & CO_VARKEYWORDS:
  608.         varkw = co.co_varnames[nargs]
  609.     
  610.     return (args, varargs, varkw)
  611.  
  612.  
  613. def getargspec(func):
  614.     if ismethod(func):
  615.         func = func.im_func
  616.     
  617.     if not isfunction(func):
  618.         raise TypeError('arg is not a Python function')
  619.     
  620.     (args, varargs, varkw) = getargs(func.func_code)
  621.     return (args, varargs, varkw, func.func_defaults)
  622.  
  623.  
  624. def getargvalues(frame):
  625.     (args, varargs, varkw) = getargs(frame.f_code)
  626.     return (args, varargs, varkw, frame.f_locals)
  627.  
  628.  
  629. def joinseq(seq):
  630.     if len(seq) == 1:
  631.         return '(' + seq[0] + ',)'
  632.     else:
  633.         return '(' + string.join(seq, ', ') + ')'
  634.  
  635.  
  636. def strseq(object, convert, join = joinseq):
  637.     if type(object) in (list, tuple):
  638.         return join(map((lambda o, c = convert, j = join: strseq(o, c, j)), object))
  639.     else:
  640.         return convert(object)
  641.  
  642.  
  643. def formatargspec(args, varargs = None, varkw = None, defaults = None, formatarg = str, formatvarargs = (lambda name: '*' + name), formatvarkw = (lambda name: '**' + name), formatvalue = (lambda value: '=' + repr(value)), join = joinseq):
  644.     specs = []
  645.     if defaults:
  646.         firstdefault = len(args) - len(defaults)
  647.     
  648.     for i in range(len(args)):
  649.         spec = strseq(args[i], formatarg, join)
  650.         if defaults and i >= firstdefault:
  651.             spec = spec + formatvalue(defaults[i - firstdefault])
  652.         
  653.         specs.append(spec)
  654.     
  655.     if varargs is not None:
  656.         specs.append(formatvarargs(varargs))
  657.     
  658.     if varkw is not None:
  659.         specs.append(formatvarkw(varkw))
  660.     
  661.     return '(' + string.join(specs, ', ') + ')'
  662.  
  663.  
  664. def formatargvalues(args, varargs, varkw, locals, formatarg = str, formatvarargs = (lambda name: '*' + name), formatvarkw = (lambda name: '**' + name), formatvalue = (lambda value: '=' + repr(value)), join = joinseq):
  665.     
  666.     def convert(name, locals = locals, formatarg = formatarg, formatvalue = formatvalue):
  667.         return formatarg(name) + formatvalue(locals[name])
  668.  
  669.     specs = []
  670.     for i in range(len(args)):
  671.         specs.append(strseq(args[i], convert, join))
  672.     
  673.     if varargs:
  674.         specs.append(formatvarargs(varargs) + formatvalue(locals[varargs]))
  675.     
  676.     if varkw:
  677.         specs.append(formatvarkw(varkw) + formatvalue(locals[varkw]))
  678.     
  679.     return '(' + string.join(specs, ', ') + ')'
  680.  
  681.  
  682. def getframeinfo(frame, context = 1):
  683.     if istraceback(frame):
  684.         lineno = frame.tb_lineno
  685.         frame = frame.tb_frame
  686.     else:
  687.         lineno = frame.f_lineno
  688.     if not isframe(frame):
  689.         raise TypeError('arg is not a frame or traceback object')
  690.     
  691.     if not getsourcefile(frame):
  692.         pass
  693.     filename = getfile(frame)
  694.     if context > 0:
  695.         start = lineno - 1 - context // 2
  696.         
  697.         try:
  698.             (lines, lnum) = findsource(frame)
  699.         except IOError:
  700.             lines = None
  701.             index = None
  702.  
  703.         start = max(start, 1)
  704.         start = max(0, min(start, len(lines) - context))
  705.         lines = lines[start:start + context]
  706.         index = lineno - 1 - start
  707.     else:
  708.         lines = None
  709.         index = None
  710.     return (filename, lineno, frame.f_code.co_name, lines, index)
  711.  
  712.  
  713. def getlineno(frame):
  714.     return frame.f_lineno
  715.  
  716.  
  717. def getouterframes(frame, context = 1):
  718.     framelist = []
  719.     while frame:
  720.         framelist.append((frame,) + getframeinfo(frame, context))
  721.         frame = frame.f_back
  722.     return framelist
  723.  
  724.  
  725. def getinnerframes(tb, context = 1):
  726.     framelist = []
  727.     while tb:
  728.         framelist.append((tb.tb_frame,) + getframeinfo(tb, context))
  729.         tb = tb.tb_next
  730.     return framelist
  731.  
  732. currentframe = sys._getframe
  733.  
  734. def stack(context = 1):
  735.     return getouterframes(sys._getframe(1), context)
  736.  
  737.  
  738. def trace(context = 1):
  739.     return getinnerframes(sys.exc_info()[2], context)
  740.  
  741.